﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Security.Cryptography;
using System.Text;
using System.Xml;

namespace Mes_app
{
    class SqlHelper
    {
        // 静态只读的连接字符串，避免每次调用方法都获取
        public static readonly string connectionString = ConfigurationManager.ConnectionStrings["sqlConnection"].ConnectionString;


        /// <summary>
        /// 获取连接字符串
        /// </summary>
        /// <returns>连接字符串</returns>
        public static string GetSqlConnectionString()
        {
            return connectionString;
        }

        /// <summary>
        /// 执行 SQL 脚本并返回一个 SqlDataReader
        /// </summary>
        /// <param name="sqlText">执行的 SQL 脚本</param>
        /// <param name="parameters">参数集合</param>
        /// <returns>返回一个 SqlDataReader</returns>
        public static SqlDataReader ExecuteReader(string sqlText, params SqlParameter[] parameters)
        {
            try
            {
                SqlConnection conn = new SqlConnection(connectionString);
                SqlCommand cmd = CreateCommand(conn, sqlText, parameters);
                conn.Open();
                return cmd.ExecuteReader(CommandBehavior.CloseConnection);
            }
            catch (SqlException ex)
            {
                LogException(ex, $"执行 ExecuteReader 时发生 SQL 异常，SQL 语句: {sqlText}");
                throw;
            }
            catch (Exception ex)
            {
                LogException(ex, $"执行 ExecuteReader 时发生其他异常，SQL 语句: {sqlText}");
                throw;
            }
        }

        /// <summary>
        /// 执行 SQL 脚本并返回受影响的行数
        /// </summary>
        /// <param name="sqlText">执行的 SQL 脚本</param>
        /// <param name="parameters">参数集合</param>
        /// <returns>受影响的行数</returns>
        public static int ExecuteNonQuery(string sqlText, params SqlParameter[] parameters)
        {
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                try
                {
                    SqlCommand cmd = CreateCommand(conn, sqlText, parameters);
                    conn.Open();
                    return cmd.ExecuteNonQuery();
                }
                catch (SqlException ex)
                {
                    LogException(ex, $"执行 ExecuteNonQuery 时发生 SQL 异常，SQL 语句: {sqlText}");
                    throw;
                }
                catch (Exception ex)
                {
                    LogException(ex, $"执行 ExecuteNonQuery 时发生其他异常，SQL 语句: {sqlText}");
                    throw;
                }
            }
        }

        /// <summary>
        /// 执行 SQL 脚本，返回查询结果中的第一行第一列的值
        /// </summary>
        /// <param name="sqlText">执行的 SQL 脚本</param>
        /// <param name="parameters">参数集合</param>
        /// <returns>查询结果中的第一行第一列的值</returns>
        public static object ExecuteScalar(string sqlText, params SqlParameter[] parameters)
        {
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                try
                {
                    SqlCommand cmd = CreateCommand(conn, sqlText, parameters);
                    conn.Open();
                    return cmd.ExecuteScalar();
                }
                catch (SqlException ex)
                {
                    LogException(ex, $"执行 ExecuteScalar 时发生 SQL 异常，SQL 语句: {sqlText}");
                    throw;
                }
                catch (Exception ex)
                {
                    LogException(ex, $"执行 ExecuteScalar 时发生其他异常，SQL 语句: {sqlText}");
                    throw;
                }
            }
        }

        /// <summary>
        /// 执行 SQL 脚本并返回一个 DataTable
        /// </summary>
        /// <param name="sqlText">执行的 SQL 脚本</param>
        /// <param name="parameters">参数集合</param>
        /// <returns>返回一个 DataTable</returns>
        public static DataTable ExecuteDataTable(string sqlText, params SqlParameter[] parameters)
        {
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                try
                {
                    SqlCommand cmd = CreateCommand(conn, sqlText, parameters);
                    using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
                    {
                        DataTable dt = new DataTable();
                        adapter.Fill(dt);
                        return dt;
                    }
                }
                catch (SqlException ex)
                {
                    LogException(ex, $"执行 ExecuteDataTable 时发生 SQL 异常，SQL 语句: {sqlText}");
                    throw;
                }
                catch (Exception ex)
                {
                    LogException(ex, $"执行 ExecuteDataTable 时发生其他异常，SQL 语句: {sqlText}");
                    throw;
                }
            }
        }

        /// <summary>
        /// 执行 SQL 脚本并返回一个 DataSet
        /// </summary>
        /// <param name="sqlText">执行的 SQL 脚本</param>
        /// <param name="parameters">参数集合</param>
        /// <returns>返回一个 DataSet</returns>
        public static DataSet ExecuteDataSet(string sqlText, params SqlParameter[] parameters)
        {
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                try
                {
                    SqlCommand cmd = CreateCommand(conn, sqlText, parameters);
                    using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
                    {
                        DataSet ds = new DataSet();
                        adapter.Fill(ds);
                        return ds;
                    }
                }
                catch (SqlException ex)
                {
                    LogException(ex, $"执行 ExecuteDataSet 时发生 SQL 异常，SQL 语句: {sqlText}");
                    throw;
                }
                catch (Exception ex)
                {
                    LogException(ex, $"执行 ExecuteDataSet 时发生其他异常，SQL 语句: {sqlText}");
                    throw;
                }
            }
        }

        /// <summary>
        /// 创建 SqlCommand 对象
        /// </summary>
        /// <param name="conn">SqlConnection 对象</param>
        /// <param name="sqlText">SQL 语句</param>
        /// <param name="parameters">参数集合</param>
        /// <returns>返回一个 SqlCommand 对象</returns>
        private static SqlCommand CreateCommand(SqlConnection conn, string sqlText, SqlParameter[] parameters)
        {
            SqlCommand cmd = new SqlCommand(sqlText, conn);
            cmd.CommandTimeout = 300;
            if (parameters != null)
            {
                cmd.Parameters.AddRange(parameters);
            }
            return cmd;
        }

        /// <summary>
        /// 记录异常信息
        /// </summary>
        /// <param name="ex">异常对象</param>
        /// <param name="message">自定义异常信息</param>
        private static void LogException(Exception ex, string message)
        {
            // 这里可以使用日志框架（如 NLog、Log4Net 等）来记录异常信息
            Console.WriteLine($"{message}, 异常信息: {ex.Message}");
        }
    }
}